﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;
using Csla;
using Csla.Serialization;
using log4net;

namespace Sireass.Bl
{
	[Serializable]
	public class UnidadResponsableEdit : BusinessBase<UnidadResponsableEdit>
	{

		#region Propiedades
		// Create a logger for use in this class
		private static readonly ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

		public static readonly PropertyInfo<long> IdUnidadResponsableProperty = RegisterProperty<long>(c => c.IdUnidadResponsable);
		public long IdUnidadResponsable
		{
			get { return GetProperty(IdUnidadResponsableProperty); }
			private set { LoadProperty(IdUnidadResponsableProperty, value); }
		}

		public static readonly PropertyInfo<long> IdEscuelaProperty = RegisterProperty<long>(c => c.IdEscuela);
		[Display(Name = "Id Escuela")]
		public long IdEscuela
		{
			get { return GetProperty(IdEscuelaProperty); }
			set { SetProperty(IdEscuelaProperty, value); }
		}

		public static readonly PropertyInfo<long> IdCargoProperty = RegisterProperty<long>(c => c.IdCargo);
		[Display(Name = "Id Cargo")]
		public long IdCargo
		{
			get { return GetProperty(IdCargoProperty); }
			set { SetProperty(IdCargoProperty, value); }
		}

		public static readonly PropertyInfo<string> UnidadResponsableProperty = RegisterProperty<string>(c => c.UnidadResponsable);
		[Display(Name = "Unidad Responsable")]
		public string UnidadResponsable
		{
			get { return GetProperty(UnidadResponsableProperty); }
			set { SetProperty(UnidadResponsableProperty, value); }
		}

		public static readonly PropertyInfo<string> UbicacionProperty = RegisterProperty<string>(c => c.Ubicacion);
		[Display(Name = "Ubicación")]
		public string Ubicacion
		{
			get { return GetProperty(UbicacionProperty); }
			set { SetProperty(UbicacionProperty, value); }
		}

		public static readonly PropertyInfo<string> CorreoProperty = RegisterProperty<string>(c => c.Correo);
		[Display(Name = "Correo electrónico")]
		public string Correo
		{
			get { return GetProperty(CorreoProperty); }
			set { SetProperty(CorreoProperty, value); }
		}

		public static readonly PropertyInfo<string> TelefonoProperty = RegisterProperty<string>(c => c.Telefono);
		[Display(Name = "Teléfono")]
		public string Telefono
		{
			get { return GetProperty(TelefonoProperty); }
			set { SetProperty(TelefonoProperty, value); }
		}

		public static readonly PropertyInfo<bool> HabilitadoProperty = RegisterProperty<bool>(c => c.Habilitado);
		[Display(Name = "Habilitado")]
		public bool Habilitado
		{
			get { return GetProperty(HabilitadoProperty); }
			set { SetProperty(HabilitadoProperty, value); }
		}

		public static readonly PropertyInfo<DateTime> FechaAltaProperty = RegisterProperty<DateTime>(c => c.FechaAlta);
		[Display(Name = "Fecha Alta")]
		public DateTime FechaAlta
		{
			get { return GetProperty(FechaAltaProperty); }
			set { SetProperty(FechaAltaProperty, value); }
		}

		public static readonly PropertyInfo<DateTime> FechaBajaProperty = RegisterProperty<DateTime>(c => c.FechaBaja);
		[Display(Name = "Fecha Baja")]
		public DateTime FechaBaja
		{
			get { return GetProperty(FechaBajaProperty); }
			set { SetProperty(FechaBajaProperty, value); }
		}
		#endregion

		#region Factory
		private UnidadResponsableEdit()
		{
			//Forbidden
		}

		public static void NewUnidadResponsableEdit(EventHandler<DataPortalResult<UnidadResponsableEdit>> callback)
		{
			DataPortal.BeginCreate<UnidadResponsableEdit>(callback);
		}

		public static UnidadResponsableEdit NewUnidadResponsableEdit()
		{
			return DataPortal.Create<UnidadResponsableEdit>();
		}

		public static void GetUnidadResponsableEdit(long id, EventHandler<DataPortalResult<UnidadResponsableEdit>> callback)
		{
			DataPortal.BeginFetch<UnidadResponsableEdit>(id, callback);
		}

		public static UnidadResponsableEdit GetUnidadResponsableEdit(long id)
		{
			return DataPortal.Fetch<UnidadResponsableEdit>(id);
		}

		public static void DeleteUnidadResponsableEdit(long id)
		{
			if (log.IsDebugEnabled)
			{
				log.Debug("DeleteUnidadResponsableEdit->id: " + id);
			}
			DataPortal.Delete<UnidadResponsableEdit>(id);
		}
		#endregion

		#region Métodos
		public static void AddObjectAuthorizationRules()
		{
			Type type = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType;
			PerfilServicioCriteria criteria = new PerfilServicioCriteria(type.FullName, true);
			PerfilServicioList perfilesPorServicio = PerfilServicioList.GetPerfilServicioList(criteria);
			List<string> roles = new List<string>(perfilesPorServicio.Count);
			foreach(PerfilServicioInfo perfilServicio in perfilesPorServicio)
			{
				roles.Add(perfilServicio.Perfil);
			}
			Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.CreateObject, roles));
			Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.GetObject, roles));
			Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.EditObject, roles));
			Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.DeleteObject, roles));
		}
		#endregion

		#region Data Portal
		[RunLocal]
		protected override void DataPortal_Create()
		{
			using (BypassPropertyChecks)
			{
				IdUnidadResponsable = -1;
			}
			base.DataPortal_Create();
		}

		private void DataPortal_Fetch(long id)
		{
			using (var dalManager = Sireass.Dal.DalFactory.GetManager())
			{
				var dal = dalManager.GetProvider<Sireass.Dal.IUnidadResponsableDal>();
				using (var data = new Csla.Data.SafeDataReader(dal.Fetch(id)))
				{
					data.Read();
					using (BypassPropertyChecks)
					{
						IdUnidadResponsable = data.GetInt64("nId_UnidadResponsable");
						IdEscuela = data.GetInt64("nId_Escuela");
						IdCargo = data.GetInt64("nId_Cargo");
						UnidadResponsable = data.GetString("cUnidadResponsable");
						Ubicacion = data.GetString("cUbicacion");
						Correo = data.GetString("cCorreo");
						Telefono = data.GetString("cTelefono");
						Habilitado = data.GetBoolean("bHabilitado");
						FechaAlta = data.GetDateTime("dFecha_Alta");
						FechaBaja = data.GetDateTime("dFecha_Baja");
					}
				}
			}
			BusinessRules.CheckRules();
		}

		[Transactional(TransactionalTypes.TransactionScope)]
		protected override void DataPortal_Insert()
		{
			using (var dalManager = Sireass.Dal.DalFactory.GetManager())
			{
				var dal = dalManager.GetProvider<Sireass.Dal.IUnidadResponsableDal>();
				using (BypassPropertyChecks)
				{
					IdUnidadResponsable = dal.Insert(IdEscuela, IdCargo, UnidadResponsable, Ubicacion, Correo, Telefono, Habilitado);
				}
			}
		}

		[Transactional(TransactionalTypes.TransactionScope)]
		protected override void DataPortal_Update()
		{
			using (var dalManager = Sireass.Dal.DalFactory.GetManager())
			{
				var dal = dalManager.GetProvider<Sireass.Dal.IUnidadResponsableDal>();
				using (BypassPropertyChecks)
				{
					dal.Update(IdUnidadResponsable, IdEscuela, IdCargo, UnidadResponsable, Ubicacion, Correo, Telefono, Habilitado);
				}
			}
		}

		[Transactional(TransactionalTypes.TransactionScope)]
		protected override void DataPortal_DeleteSelf()
		{
			using (BypassPropertyChecks)
			{
				DataPortal_Delete(IdUnidadResponsable);
			}
		}

		//[Transactional(TransactionalTypes.TransactionScope)]
		//protected override void DataPortal_DeleteSelf()
		//{
		//  using (var dalManager = Sireass.Dal.DalFactory.GetManager())
		//  {
		//    var dal = dalManager.GetProvider<Sireass.Dal.IUnidadResponsableDal>();
		//    using (BypassPropertyChecks)
		//    {
		//      dal.Delete(Id);
		//    }
		//  }
		//}

		[Transactional(TransactionalTypes.TransactionScope)]
		private void DataPortal_Delete(long id)
		{
			if (log.IsDebugEnabled)
			{
				log.Debug("DataPortal_Delete->id: " + id);
			}
			using (var dalManager = Sireass.Dal.DalFactory.GetManager())
			{
				var dal = dalManager.GetProvider<Sireass.Dal.IUnidadResponsableDal>();
				dal.Delete(id);
			}
		}

		protected override void DataPortal_OnDataPortalInvoke(DataPortalEventArgs e)
		{
			// implement your behavior here
			base.DataPortal_OnDataPortalInvoke(e);
		}

		protected override void DataPortal_OnDataPortalInvokeComplete(DataPortalEventArgs e)
		{
			// implement your behavior here
			base.DataPortal_OnDataPortalInvokeComplete(e);
		}

		protected override void Child_OnDataPortalException(DataPortalEventArgs e, Exception ex)
		{
			// implement your behavior here
			base.Child_OnDataPortalException(e, ex);
		}
		#endregion
	}
}
